home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Graphics / GraphicsWorkshop / Source / Indexer.m < prev    next >
Text File  |  1992-05-18  |  6KB  |  250 lines

  1.  
  2. /* Generated by Interface Builder */
  3.  
  4. #import <stdio.h>
  5. #import <libc.h>
  6. #import <dpsclient/wraps.h>
  7. #import <appkit/Box.h>
  8. #import <appkit/Button.h>
  9. #import <appkit/ButtonCell.h>
  10. #import <appkit/color.h>
  11. #import <appkit/Control.h>
  12. #import <appkit/NXBitmapImageRep.h>
  13. #import <appkit/NXColorWell.h>
  14. #import <appkit/OpenPanel.h>
  15. #import <appkit/SavePanel.h>
  16. #import <appkit/Text.h>
  17. #import <appkit/TextField.h>
  18. #import <appkit/View.h>
  19. #import <appkit/Window.h>
  20. #import "GraphicApp.h"
  21. #import "NXBitmapImageRepControl.h"
  22. #import "Indexer.h"
  23. #import "Converter.h"
  24.  
  25. @implementation Indexer
  26.  
  27.     extern char        *errors[];
  28.  
  29. + new
  30. {
  31.     self = [super new];
  32.     
  33.     [NXApp setIndexer: self];
  34.     
  35.     return self;
  36. }
  37.  
  38. - setMyWText:anObject
  39. {
  40.     myWText = anObject;
  41.     [myWText setIntValue: 100];
  42.     return self;
  43. }
  44.  
  45. - setMyXText:anObject
  46. {
  47.     myXText = anObject;
  48.     [myXText setIntValue: 6];
  49.     return self;
  50. }
  51.  
  52. - renderImage: (id)image at: (int)x : (int)y withName: (const char *)name
  53. {
  54.     NXRect        miniRect;
  55.     float            stringWidth;
  56.     float            stringHeight;
  57.     float            ratio;
  58.     
  59.     if ([image pixelsWide] > [image pixelsHigh]) {
  60.         ratio = (float)[image pixelsHigh] / (float)[image pixelsWide];
  61.         miniRect.origin.x = (float)x * (float)width;
  62.         miniRect.origin.y = (float)y * ((float)height + 12.0) + 12.0;
  63.         miniRect.size.width = (float)width;
  64.         miniRect.size.height = (float)height * ratio;
  65.     } else {
  66.         ratio = (float)[image pixelsHigh] / (float)[image pixelsWide];
  67.         miniRect.origin.x = (float)x * (float)width + ((float)width - (float)width / ratio) / 2;
  68.         miniRect.origin.y = (float)y * ((float)height + 12.0) + 12.0;
  69.         miniRect.size.width = (float)width / ratio;
  70.         miniRect.size.height = (float)height;
  71.     }
  72.     
  73. #ifdef DEBUG
  74.     fprintf(stderr, "   render at (%f, %f), of size %f x %f\n",
  75.         miniRect.origin.x, miniRect.origin.y, miniRect.size.width, miniRect.size.height);
  76. #endif
  77.     
  78.     PSgsave();
  79.         if (miniRect.size.height < height) {
  80.             PStranslate(0, (height - miniRect.size.height) / 2);
  81.         }
  82.         PSgsave();
  83.             [image drawIn: &miniRect];
  84.         PSgrestore();
  85.     
  86.         PSstringwidth((char *)name, &stringWidth, &stringHeight);
  87.         PSmoveto(x * width + width / 2 - stringWidth / 2, y * (height + 12) + 2.0);
  88.         PSshow((char *)name);
  89.     PSgrestore();
  90.     
  91.     return self;
  92. }
  93.  
  94. - createIndex
  95. {
  96.     int            x;
  97.     int            px, py;
  98.     id            myImage;
  99.     char            buffer[1024];
  100.     NXRect        tRect;
  101.  
  102.     [view lockFocus];
  103.     
  104.     PSselectfont("Times-Roman", 12.0);
  105.     
  106.     NXSetColor([myColor color]);
  107.     PSrectfill(0.0, 0.0, width * xCount, (height + 12.0) * yCount);
  108.     NXSetColor(NX_COLORBLACK);
  109.     
  110.     for (x = px = 0, py = yCount - 1; x < count; x++) {
  111. #ifdef DEBUG
  112.         fprintf(stderr, "Working on image %s\n", files[x]);
  113. #endif
  114.         sprintf(buffer, "Now Loading: %s", files[x]);
  115.         [progressTextName setStringValue: buffer];
  116.         
  117.         [progressTextView getBounds: &tRect];
  118.         [progressTextView lockFocus];
  119.             PSsetrgbcolor(0.7, 0.0, 0.0);
  120.             PSrectfill(    tRect.origin.x + 2, tRect.origin.y + 2,
  121.                         (tRect.size.width - 4.0) * (((float)x + 0.5) /  (float)count),
  122.                         tRect.size.height - 4.0);
  123.             PSflush();
  124.         [progressTextView unlockFocus];
  125.         [[progressTextView window] flushWindow];
  126.         
  127.         if (myImage = [images openAndReturnImage: files[x]]) {
  128.             if ([images errorState] != CONVERT_ERR_NONE) {
  129.                 NXRunAlertPanel("Warning",
  130.                                 errors[[images errorMessage]],
  131.                                 "Continue", NULL, NULL);
  132.             }
  133.             sprintf(buffer, "Now Rendering: %s", files[x]);
  134.             [progressTextName setStringValue: buffer];
  135.             [progressTextView getBounds: &tRect];
  136.             [progressTextView lockFocus];
  137.                 PSsetrgbcolor(0.7, 0.0, 0.0);
  138.                 PSrectfill(    tRect.origin.x + 2, tRect.origin.y + 2,
  139.                             (tRect.size.width - 4.0) * ((float)(x + 1) /  (float)count),
  140.                             tRect.size.height - 4.0);
  141.                 PSflush();
  142.             [progressTextView unlockFocus];
  143.             [[progressTextView window] flushWindow];
  144.         
  145.             [self renderImage: myImage at: px : py withName: files[x]];
  146.             if (++px == xCount) {
  147.                 px = 0;
  148.                 py--;
  149.             }
  150.             [myImage free];
  151.         }
  152.         else {
  153.             NXRunAlertPanel("Alert", 
  154.                             "Unable to open file: %s\n\n%s", 
  155.                             "Continue", NULL, NULL, 
  156.                             files[x], errors[[images errorMessage]]);
  157.             return NO;
  158.         }
  159.     }
  160.  
  161.     [view unlockFocus];
  162.  
  163.     return self;
  164. }
  165.  
  166. - createIndexView
  167. {
  168.     NXRect        myRect = { 0, 0, xCount * width, yCount * (height + 12.0) };
  169.  
  170.     window = [[Window alloc] 
  171.                     initContent:    &myRect
  172.                     style:        NX_PLAINSTYLE
  173.                     backing:        NX_RETAINED
  174.                     buttonMask:    0
  175.                     defer:        NO];
  176.     view = [window contentView];
  177.  
  178.     return self;
  179. }
  180.  
  181. - makeIndex:(id)imagesIn
  182. {
  183.     id         openPanel = [OpenPanel new];
  184.     int        x;
  185.     NXRect    myRect;
  186.     id        image;
  187.     
  188.     images = imagesIn;
  189.     
  190.     [[openPanel contentView] getBounds: &myRect];
  191.     [openPanel allowMultipleFiles: YES];
  192.     if (!saveView) {
  193.         saveView = [saveViewWindow contentView];
  194.         [saveView removeFromSuperview];
  195.     }
  196. //    [saveView sizeTo: myRect.size.width : myRect.size.height];
  197.     [openPanel setAccessoryView: saveView];
  198.  
  199.     if (![images runOpenPanel: openPanel]) {
  200.         [openPanel setAccessoryView: nil];
  201.         return nil;
  202.     }
  203.  
  204.     files = (char **)[openPanel filenames];
  205.     chdir((char *)[openPanel directory]);
  206.  
  207. #ifdef DEBUG
  208.     fprintf(stderr, "I should make an index for\n");
  209. #endif
  210.     for (x = 0; files[x]; x++) {
  211. #ifdef DEBUG
  212.         fprintf(stderr, "   %s\n", files[x]);
  213. #endif
  214.     }
  215.     count = x;
  216.  
  217.     width = [myWText intValue];
  218.     if (width > 400) width = 400;
  219.     height = width;
  220.     xCount = [myXText intValue];
  221.     if (xCount > 20) xCount = 20;
  222.     if (count < xCount) xCount = count;
  223.     yCount = (count - 1) / xCount + 1;
  224.  
  225.     [progressWindow makeKeyAndOrderFront: self];
  226.     [progressTextView getBounds: &myRect];
  227.     [progressTextView lockFocus];
  228.         PSsetrgbcolor(0.7, 0.0, 0.0);
  229.         NXDrawWhiteBezel(&myRect, &myRect);
  230.         PSflush();
  231.     [progressTextView unlockFocus];
  232.     [progressWindow flushWindow];
  233.  
  234.     [self createIndexView];
  235.     [self createIndex];
  236.  
  237.     [view getBounds: &myRect];
  238.     [view lockFocus];
  239.     image = [[NXBitmapImageRep alloc] initData: NULL fromRect: &myRect];
  240.     [view unlockFocus];
  241.     
  242.     [progressWindow close];
  243.     [openPanel setAccessoryView: nil];
  244.     [window free];
  245.     
  246.     return image; 
  247. }
  248.  
  249. @end
  250.